package jsp;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;

/**
 * Author:shixiaojun@itany.com
 * Date:2022/4/12 16:10
 * Version:1.0-SNAPSHOT
 * Description:
 */
@WebServlet("*.cookie")
public class CookieServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String path = request.getServletPath();
        if("/add.cookie".equals(path)){
            addCookie(request,response);
        }
        if("/find.cookie".equals(path)){
            findCookie(request,response);
        }
        if("/modify.cookie".equals(path)){
            modifyCookie(request,response);
        }
        if("/remove.cookie".equals(path)){
            removeCookie(request,response);
        }
    }

    public void addCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 创建一个Cookie对象
        // 构造函数需要提供两个参数
        // 参数一:数据的key
        // 参数二:数据的value,类型是字符串,因此,只能保存字符串
        Cookie cookie = new Cookie("username","admin");
        // 当保存中文时,会报错,错误原因:Control character in cookie value or attribute.
        // 简单来讲:字符集问题
        // Cookie只能保存ISO8859-1的字符集
        // 因此,需要对字符集进行处理
        // 在Cookie中提供了对应的工具URLEncoder与URLDecoder
        // String s = URLEncoder.encode(str,character):表示将一个指定字符集character的字符串str转换成Cookie所支持的字符集
        // 参数一:需要转换的字符串
        // 参数二:当前字符串的字符集
        // 返回值:Cookie支持的字符串
//        Cookie cookie2 = new Cookie("name","管理员");
        Cookie cookie2 = new Cookie("name", URLEncoder.encode("管理员","UTF-8"));

        Cookie cookie3 = new Cookie("password","123456");
        // 设置生存时间,其值是一个数字,单位:秒
        cookie3.setMaxAge(10);

        // 返回响应的时候,将cookie同时返回
        // 即:将cookie添加到响应对象中
        response.addCookie(cookie);
        response.addCookie(cookie2);
        response.addCookie(cookie3);
    }

    public void findCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 服务器发送请求的时候,会将Cookie存放在请求中传递到服务器
        // 可以在请求中获取到所有的Cookie信息
        // 由于Cookie可能不止一个,因此返回的是一个数组
        Cookie[] cookies = request.getCookies();
        for(Cookie cookie : cookies){
            // Cookie提供了获取key与value的方法
//            System.out.println("key:"+cookie.getName()+",value:"+cookie.getValue());
            // 由于Cookie的value中可能存在中文
            // 因此,需要对中文进行还原
            // String s = URLDecoder.decode(str,character)
            // 参数一:需要转换的字符串
            // 参数二:需要转换成什么样的字符集
            // 返回值:转换后的字符串,如果是非中文,转换不受影响
            System.out.println("key:"+cookie.getName()+",value:"+ URLDecoder.decode(cookie.getValue(),"UTF-8"));
        }
    }
    public void modifyCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Cookie中不存在修改方法
        // 但是如果添加Cookie的时候,已经存在了对应key的Cookie
        // 则会自动覆盖原有的Cookie
        // 因此,修改本质上即为添加,只是添加的时候其key是需要修改的Cookie的key即可
        Cookie cookie = new Cookie("username","alice");
        response.addCookie(cookie);
    }

    public void removeCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 在使用Cookie的时候,当Cookie过期即为删除
        // 有两种情况会导致Cookie过期
        // 1.会话结束
        // 2.设置了Cookie的生存时间,超出生存时间即为过期
        Cookie cookie = new Cookie("username","");
        cookie.setMaxAge(0);
        response.addCookie(cookie);
    }
}
